#include "Dri_SysTick.h"

// 定义全局变量，用于记录SysTick的中断次数
uint16_t g_ms_cnt = 0;

/**
 * @brief 初始化SysTick, 固定每隔1ms触发一次中断
 */
void Dri_SysTick_Init(void)
{
    // 1. 时钟源设置为HCLK
    SysTick->CTRL |= SysTick_CTRL_CLKSOURCE;

    // 2. 设置SysTick的重载值，实现每1ms中断一次
    SysTick->LOAD = 72000 - 1;

    // 3. 使能SysTick中断
    SysTick->CTRL |= SysTick_CTRL_TICKINT;

    // 4. 使能SysTick计数器
    SysTick->CTRL |= SysTick_CTRL_ENABLE;
}

/**
 * @brief 指定延时多少ms
 *
 * @param ms 指定延时的时间，单位ms
 */
void Dri_SysTick_Delayms(uint16_t ms)
{
    g_ms_cnt = ms;

    while (g_ms_cnt)
        ;
}

/**
 * @brief 指定延时多少s
 *
 * @param s 指定延时的时间，单s
 */
void Dri_SysTick_Delays(uint16_t s)
{
    g_ms_cnt = s * 1000;

    while (g_ms_cnt)
        ;
}

/* ------------------------------------------------------------------------------ */
// 定义弱函数，当SysTick触发中断的时候被调用
__weak void Dri_SysTick_Callback(void)
{
}

// 定义 SysTick 的中断服务函数
void SysTick_Handler(void)
{
    // 计数递减
    if (g_ms_cnt > 0)
    {
        g_ms_cnt--;
    }

    // 调用弱函数
    Dri_SysTick_Callback();
}
